package com.nineclock.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.threadlocal.CurrentUserHolder;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import com.nineclock.system.service.SysCompanyContactConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
@Slf4j
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {

    @Autowired
    SysCompanyContactConfigMapper companyContactConfigMapper;


    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO companyContactConfigDTO) {
        //健壮性的判断
        if(companyContactConfigDTO == null || StrUtil.isEmpty(companyContactConfigDTO.getName())){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //1. 从线程中获取企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //把dto转换为pojo对象
        SysCompanyContactConfig companyContactConfig = BeanHelper.copyProperties(companyContactConfigDTO, SysCompanyContactConfig.class);
        //设置其他字段
        companyContactConfig.setFieldType("string");
        companyContactConfig.setStatus((short)1);
        //设置企业id(先设置 企业id 为1 ， 后续优化)
        companyContactConfig.setCompanyId(companyId);

        companyContactConfigMapper.insert(companyContactConfig);
    }

    /**
     * 查询并初始化 某企业的通讯录字段
     *
     * @return
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompanyContactConfig() {
        //1. 从线程中获取企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();
        //2. 查询该企业的通讯录字段
        LambdaQueryWrapper<SysCompanyContactConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);
        //查询通讯录字段
        List<SysCompanyContactConfig> contactConfigList = companyContactConfigMapper.selectList(wrapper);
        //3. 如果没有查询到通讯录字段， 就初始化字段
        if(CollectionUtil.isEmpty(contactConfigList)){
            //重新创建集合对象
            contactConfigList = new ArrayList<>();
            for (String contactName : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                //创建通讯录字段
                SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
                //设置字段的值
                companyContactConfig.setName(contactName);
                companyContactConfig.setType("fixed");
                companyContactConfig.setStatus((short)1);
                companyContactConfig.setFieldType("string");
                companyContactConfig.setCompanyId(companyId);
                //写入数据库
                companyContactConfigMapper.insert(companyContactConfig);
                //添加通讯录字段到集合中
                contactConfigList.add(companyContactConfig);
            }
        }
        //把 pojo转换为dto
        List<SysCompanyContactConfigDTO> companyContactConfigDTOS = BeanHelper.copyWithCollection(contactConfigList, SysCompanyContactConfigDTO.class);
        //返回dto集合
        return companyContactConfigDTOS;
    }

    @Override
    public void updateCompanyContactConfig(Long id, Short status) {
        if(id == null || status == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }

        //1. 从线程中获取企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();
        //设置要更新的条件
        LambdaUpdateWrapper<SysCompanyContactConfig> wrapper = new LambdaUpdateWrapper();
        wrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);
        wrapper.eq(SysCompanyContactConfig::getId, id);
        //要更新的字段
        SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
        companyContactConfig.setStatus(status);
        //更新企业通讯录字段
        companyContactConfigMapper.update( companyContactConfig , wrapper);
    }
}
